package controllers;

import java.sql.SQLException;

import models.Administrador;
import models.Cliente;
import models.InterfaceAdministracao;
import models.InterfaceServicosCliente;
import models.SenhaIncorretaException;
import models.ServicosAdministracao;
import models.ServicosCliente;
import models.TipoUsuario;
import models.Usuario;
import models.UsuarioBloqueadoException;
import models.dados.DadoNaoEncontradoException;
import controllers.Secure.Security;

public class SegurancaAdministracao extends Secure.Security {

	static InterfaceAdministracao servicosAdministracao = ServicosAdministracao
			.getInstancia();
	static InterfaceServicosCliente servicosCliente = ServicosCliente
			.getInstancia();

	public static boolean authenticate(String usuario, String senha) {

		try {
			return servicosAdministracao.loginAdministrador(usuario, senha);
		} catch (UsuarioBloqueadoException e) {
			forbidden();

		} catch (DadoNaoEncontradoException e) {
			try {
				return servicosCliente.login(usuario, senha);
			} catch (DadoNaoEncontradoException e1) {
				renderText("Usuario nao encontrado");
				e1.printStackTrace();
			} catch (UsuarioBloqueadoException e1) {
				forbidden("Este Usuario esta bloqueado");
				
				

			}
			

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;

	}
	
	public  static void onAuthenticated(){
		String nomeUsuario = connected();
		try {
			Usuario usuario = servicosAdministracao.pesquisarUsuario(nomeUsuario);
			if (usuario.getTipo()==TipoUsuario.CLIENTE){
				Application.inicial();
			}else{
				Administracao.inicial_administracao();
			}
		} catch (DadoNaoEncontradoException e) {
			error("Falha desconhecida de autenticação");
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
		
	}
	
	

	public static void onDisconnected() {
	    Application.inicial();
	}

	public static boolean check(String profile) {

		if (profile.equals("administrador")) {
			try {
				Administrador adm = servicosAdministracao
						.pesquisarAdministrador(connected());
				if (adm.getTipo() == TipoUsuario.ADM_SUPER
						|| adm.getTipo() == TipoUsuario.ADM_VENDAS
						|| adm.getTipo() == TipoUsuario.ADM_WEB) {
					return true;
				}
			} catch (DadoNaoEncontradoException e) {
				return false;

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		if (profile.equals("adm_super")) {
			try {
				Administrador adm = servicosAdministracao
						.pesquisarAdministrador(connected());
				if (adm.getTipo() == TipoUsuario.ADM_SUPER) {
					return true;
				}
			} catch (DadoNaoEncontradoException e) {
				return false;

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		if (profile.equals("adm_vendas")) {
			try {
				Administrador adm = servicosAdministracao
						.pesquisarAdministrador(connected());
				if (adm.getTipo() == TipoUsuario.ADM_SUPER
						|| adm.getTipo() == TipoUsuario.ADM_VENDAS) {
					return true;
				}
			} catch (DadoNaoEncontradoException e) {
				return false;

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		if (profile.equals("adm_web")) {
			try {
				Administrador adm = servicosAdministracao
						.pesquisarAdministrador(connected());
				if (adm.getTipo() == TipoUsuario.ADM_SUPER
						|| adm.getTipo() == TipoUsuario.ADM_WEB) {
					return true;
				}
			} catch (DadoNaoEncontradoException e) {
				return false;

			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
		if (profile.equals("cliente")) {
			try {
				Cliente cliente = servicosCliente
						.getCliente(connected());
				if (cliente.getTipo() == TipoUsuario.CLIENTE) {
					return true;
				}
			} catch (DadoNaoEncontradoException e) {
				return false;

			}

		}
		if (profile.equals("cliente_nao_cadastrado")) {
			if(!Security.isConnected()){
				return true;
			}else{
				try {
					Cliente cliente = servicosCliente
							.getCliente(connected());
					if (cliente.getTipo() == TipoUsuario.CLIENTE_NAO_CADASTRADO ||
						cliente.getTipo() == TipoUsuario.CLIENTE) {
						return true;
					}
				} catch (DadoNaoEncontradoException e) {
					return false;

				}
				
			}
			
			

		}
		

		return false;
	}

}
